

// / ts中的基本数据类型有哪些：number string Boolean 字面量 any unknown void object array 元组 enum 类型联合 类型断言 类型推断
/* 声明类型变量的格式  关键字可以是 let var const
关键字 变量：数据类型；
数据类型 = 值


*/
let num:number;
num = 123;
// num = "sds"
console.log(num);

let num1:number = 222;
console.log(333)

let str1 :string = 'abc';
let str2 :string = 'erw';
let str3 = str1 + str2;
console.log( str1,str2);
console.log(str3);

// 使用一个关键字声明多个变量
let str4:string,num4:number,boola:boolean;
str4='123';
num4=123;
boola=false;
console.log(str4,num4,boola);
// 当你声明完变量类型时候，你的变量的类型就不能变化，不是该类型就会报错

// 当变量和赋值是同时进行的，ts就会自动编译变量的数据类型，可以忽略类型声明，但是实际上它声明了类型
let bool1 = false;
bool1 = true;
// 当变量和赋值是同时进行的，ts就会自动编译变量的数据类型，可以忽略类型声明，但是实际上它声明了类型
// bool1 = 123;
console.log(bool1);

//字面量
let aa:'sdsds';
aa:'sdsds';
// aa:sadas;
console.log(aa);

//联合类型
let bb:'111'|'222'|'333'| 123 | false;
bb = 123;
console.log(bb);



//any unkuow
//ts必须规定数据类型， 当不知道变量为什么数据类型时 如不写当声明变量和赋值在一行时ts默认给设置

let cc: any; //any 可以赋值为任意数据类型
cc = 123333 
let dd:string;
console.log(cc);
console.log(dd);


let ee:unknown;
ee=789;
ee=false;
let ff:string;
// ff = ee; unknown类型不能赋值给其他类型
let gg:unknown;
gg = ee;
console.log(ee);
// any 和 unknown  都可以赋值为任意数据类型 ，但是any可以赋值给其他数据类型,unknown不能赋值给其他类型，总结 unknown是一种安全的any
// any不建议使用 能使用unknown就不要使用any

/* void
函数在ts当中怎么写*/
// function fun(a, b) {
//     return a + b;
// } 
// console.log(fun(1,2))
// 函数返回值：当函数内部有return 函数的返回值就是return后面的值，当没有return时，函数的返回值undefined
// 形参需要设计数据类型  函数的返回值需要设计数据类型
/* function  函数名（形参1：形参1的数据类型，形参2：形参2的数据类型）:函数返回值的数据类型{
    。。。。
    return xxx
} */

function sum(a:number,b:number):number{
    return a + b;
}
// console.log('aa',2);

function foo(a:string,b:string):string{
    return a + b;
}
console.log(foo("aa","bb"));
// void表示没有任何类型，一般用来表示函数的返回值 undefined或者null

function fun1(a:string,b:number): void{
    let c:string = a + b;
    console.log(c);
    return null;
}
console.log(fun1("aa",2));

// ts拥有自动的类型判断机制
// ts进行类型声明，变量类型声明 形参类型声明、函数返回值类型声明
// 当指定了类型声明之后，ts编辑器就会根据类型声明声明的类型去自动检查是否符合类型，符合执行代码，不符合报错
// 当指定类型声明之后，该变量之鞥呢存储该类型的值

// obj

let obj:{name:string,age:number};
obj = {
    name:'qwqw',
    age:22
}
console.log(obj)
/* 
当对象的数据类型规定完毕后，创建的对象必须严格按照对象规定的数据类型创建，不能多不能少，数据类型也不能不同
有没有需求：对象中的某个属性可有可无

*/
// 在规定类型时，在属性名后面加?，表示该属性可选   可写可不写
let obj2:{name:string,age:number,sex?:string}
obj2 = {
    name:'lili',
    age:18,
    // sex:"w"
}
console.log(obj2);

//任意往后面添加属性名
let obj3 :{name:string,age:number,[propName:string]:unknown};
obj3 = {
    name:'qwq',
    age:16,
    sex:'sas',
    sds:222,
}
obj3.waa = 3;
console.log(obj3)

//array
let arr:string[]; //表示数组中的元素类型都是字符串
// arr = [www,www,ww]
arr=['ss','ww',"ee"]

let arr1:number[];
// arr1 = [2222,3"323"]
arr1 = [22,22,222]; //表示数组中的元素类型都是number类型

let arr2 :Array<number>; //表示数组中的元素类型都是number类型
arr2 = [123]
let arr3 : Array<string>; //表示数组中的元素类型都是字符串
arr3 = ["ssd" ,"sds"]

// 元组 ：元组类型表示的是一个已知元素数量和类型的数组，各个元素的类型不一定相同

let arr4:[string,number,boolean];
arr4 = ['aa',32,false]; //顺序必须一致
console.log(arr4);

//枚举
// 
enum Color{
    Yellow,
    Pink,
    Blue
}
let ssf: Color = Color.Pink;

console.log(ssf);
console.log(Color[0]); //获取下标为0的值

// 类型联合
let uu:'qwe'|'wer'|'ert'|123;
uu = 'qwe';
uu = 123;
function boo(a:string|number,b:number):void{
    // let cc:string = a+b;
    // console.log(cc);
    console.log(a ,b);
}
boo(22,45)

//类型断言
// 可以用来手动指定一个值的类型
//语法:
//  方式一: <类型>值
//  方式二: 值 as 类型
//
function bunn(x:number|string|false){
    if((<string>x).length){
        console.log(111);
        return (<string>x).length;
    }else{
        console.log(222);
        return x.toString().length;
    }

}
console.log(bunn(11)) 
// / 当使用了ts规定了数据类型之后，你传入的值必须是该类型的值，如果不是就会报错

//类型推断 
//ts中没有明确指定类型时，自动推断出一个数据类型
// 两种情况
//1.定义变量时赋值了, 推断为对应的类型.
//2. 定义变量时没有赋值, 推断为any类型


let qpple = 'panduan';

let appleA;
appleA = 13;
appleA = 'gerg';





